package com.aura.common.core.domain.enums;

import lombok.Getter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Arrays;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadPoolExecutor;

/**
 * 拒绝策略枚举（稳定版 + 中文注释）
 */
@Getter
public enum RejectType {

    /**
     * AbortPolicy策略：默认策略，直接抛出 RejectedExecutionException 异常
     * 适合对系统稳定性要求高的场景（例如核心服务），宁可失败也不积压。
     */
    AbortPolicy(1, new ThreadPoolExecutor.AbortPolicy()),

    /**
     * CallerRunsPolicy策略：调用者线程自己执行这个任务（同步执行）
     * 适合允许请求变慢但不能丢任务的场景，如异步落库、日志。
     */
    CallerRunsPolicy(2, new ThreadPoolExecutor.CallerRunsPolicy()),

    /**
     * DiscardOldestPolicy策略：丢弃队列最前面的（最老的）任务，尝试提交当前任务
     * 适合不太关注最老任务结果的场景，如定时刷新、缓存更新等。
     */
    DiscardOldestPolicy(3, new ThreadPoolExecutor.DiscardOldestPolicy()),

    /**
     * DiscardPolicy策略：直接丢弃当前提交的任务，不抛异常
     * 适合允许数据丢失、追求吞吐量的场景，比如日志收集、监控上报等。
     */
    DiscardPolicy(4, new ThreadPoolExecutor.DiscardPolicy());

    private final Integer value;
    private final RejectedExecutionHandler handler;

    RejectType(Integer value, RejectedExecutionHandler handler) {
        this.value = value;
        this.handler = handler;
    }

    private static final Logger log = LoggerFactory.getLogger(RejectType.class);

    /**
     * 根据编号获取对应的拒绝策略处理器（默认返回 CallerRunsPolicy）
     */
    public static RejectedExecutionHandler getHandlerByValue(Integer value) {
        return Arrays.stream(values())
                .filter(type -> type.getValue().equals(value))
                .map(RejectType::getHandler)
                .findFirst()
                .orElseGet(() -> {
                    log.warn("线程池拒绝策略配置非法（{}），已切换为默认策略 CallerRunsPolicy", value);
                    return RejectType.CallerRunsPolicy.getHandler();
                });
    }
}
